]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
windowManager: Update stacking during workspace switches
authorFlorian Müllner <fmuellner@gnome.org>
Wed, 17 Dec 2014 21:57:44 +0000 (22:57 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 19 Dec 2014 10:39:50 +0000 (11:39 +0100)
When animating workspace switches, windows on the old and new workspaces
are temporarily reparented. If windows are restacked, those windows will
thus be ignored by mutter until meta_switch_workspace_completed() resyncs
the stacking at the end of the animation.
As a result, activating a window on another workspace that is not on top
of the stack is very noticeably a two-step operation of switching workspace
and raising the window. There is a technical reason for that order[0], but
we can avoid the visible disruption by manually syncing the stack during
the switch operation.

[0] https://git.gnome.org/browse/mutter/tree/src/core/workspace.c#n590

https://bugzilla.gnome.org/show_bug.cgi?id=741680

js/ui/windowManager.js

index d88c02242307fe981bc232b95789fcdbe36e3e7f..b8af0e0b6493c0af00a709169a3cb7cc4d1bd8f8 100644 (file)
@@ -618,6 +618,7 @@ const WindowManager = new Lang.Class({
         this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
         this._shellwm.connect('filter-keybinding', Lang.bind(this, this._filterKeybinding));
         this._shellwm.connect('confirm-display-change', Lang.bind(this, this._confirmDisplayChange));
+        global.screen.connect('restacked', Lang.bind(this, this._syncStacking));
 
         this._workspaceSwitcherPopup = null;
         this._tilePreview = null;
@@ -1248,6 +1249,24 @@ const WindowManager = new Lang.Class({
         return !(this._allowedKeybindings[binding.get_name()] & Main.actionMode);
     },
 
+    _syncStacking: function() {
+        if (this._switchData == null)
+            return;
+
+        // Update stacking of windows in inGroup (aka the workspace we are
+        // switching to). Windows in outGroup are about to be hidden anyway,
+        // so we just ignore them here.
+        let windows = global.get_window_actors();
+        let sibling = null;
+        for (let i = 0; i < windows.length; i++) {
+            if (windows[i].get_parent() != this._switchData.inGroup)
+                continue;
+
+            this._switchData.inGroup.set_child_above_sibling(windows[i], sibling);
+            sibling = windows[i];
+        }
+    },
+
     _switchWorkspace : function(shellwm, from, to, direction) {
         if (!Main.sessionMode.hasWorkspaces || !this._shouldAnimate()) {
             shellwm.completed_switch_workspace();